﻿//#define _CRT_SECURE_NO_WARNINGS 1
//#include"heap.h"//功能函数的数据库
//void PrintTopk(int k)
//{
//	FILE* open = fopen("data.txt", "r");
//	if (!open)
//	{
//		perror("open");
//		exit(-1);
//	}
//	int* nums = (int*)malloc(sizeof(int) * k);
//	//先取k个数据放入数组nums中
//	for (int i = 0; i < k; i++)
//	{
//		fscanf(open, "%d", nums + i);
//	}
//	//用向下调整，也可用向上体调整，效果都一样
//	for (int i = (k - 2) / 2; i >= 0; i--)
//	{
//		//小堆排列
//		Adjustdown(nums, k, i);
//	}
//	int x = 0;
//	//开始在文件中查找数据，将所有最大数据放入小堆中
//	while (fscanf(open, "%d", &x) != -1)//fscanf在使用后会自动往下跳，文件末尾为EOF(-1)
//	{
//		//放入最大值,不能放入最小值，因为是小堆排列，一旦swap替换，就不能确定最小数据在堆中
//		//因为树中的根为最小值
//		if (x > nums[0])
//		{
//			swap(&x, &nums[0]);
//			Adjustdown(nums, k, 0);
//		}
//	}
//	//输出
//	for (int i = 0; i < k; i++)
//	{
//		fprintf(stdout, "%d ", nums[i]);
//	}
//	free(nums);
//	fclose(open);
//}
//void CreatDate()
//{
//	int n = 10000000;
//	srand(time(0));
//	const char* file = "data.txt";
//	FILE* fin = fopen(file, "w");
//	if (fin == NULL)
//	{
//		perror("fopen error");
//		return;
//	}
//	for (int i = 0; i < n; ++i)
//	{
//		int x = (rand() + i) % 10000000;
//		fprintf(fin, "%d\n", x);
//	}
//	fclose(fin);
//}
//int main()
//{
//	CreatDate();
//	PrintTopk(5);
//	return 0;
//}

//#include"heap.h"//功能函数的数据库
////堆排序算法
//void HeapSort(int* a, int n)
//{
//	//在主函数中已经创建小堆，这一步可以不用在调整了，但是对于没有调整过的树来说必须先进行调整
//	for (int i = (n - 2) / 2; i >= 0; i--)
//	{
//		Adjustdown(a, n, i);
//	}
//	//进行排序(小堆排序)
//	int x = n - 1;
//	while (x > 0)
//	{
//		swap(&a[0], &a[x]);
//		x--;
//		Adjustdown(a, x + 1, 0);
//	}
//}
//int main()
//{
//	Heap* hp = (Heap*)malloc(sizeof(Heap));
//	int a[] = { 1,2,3,9,8,7,5,4,6 };
//	//注意：已经创建小堆
//	Heapcreate(hp, a, sizeof(a) / sizeof(int));
//	HeapSort(hp->_a, hp->_size);
//	for (int i = 0; i < hp->_size; i++)
//	{
//		fprintf(stdout, "%d ", hp->_a[i]);
//	}
//	return 0;
//}